﻿CREATE PROCEDURE [dbo].[RepriceLinesInsert] --переоценка товара
(
	@DocId int,
	@OldPartyId int,							--партия товара, которая переоценивается
	@NewBarCode char(12),
	@NewRetailPrice decimal(19,2),  --новая цена 
	@Qntty int,  --количество товара, который переоценивается
	@RepriceWriteoffReasonId int, --код причины списания/переоценки
	@RepriceWriteoffReasonText  varchar(50),--причина для кода 4 
	@QualityLossMark varchar(50), --признак понижения качества
	@Note varchar(250),
	@MW varchar(50),
	@MD datetime
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intRowCount int, @intNextId int
DECLARE @decOldPrice decimal(19,2), @datDocDate smalldatetime, @datSrcDocDate smalldatetime
DECLARE @intT int, @intInputLineId int, @intGoodsId int, @intReturnLineId int, @intNewPartyId int
DECLARE @intInputCount int, @intOutputCount int
SET NOCOUNT ON

IF (@DocId Is Null) OR (@OldPartyId Is Null) OR (@NewRetailPrice Is Null) 
OR (@NewRetailPrice <= 0 ) OR (@Qntty Is Null) OR (@Qntty <= 0 ) OR (@RepriceWriteoffReasonId Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @decOldPrice = RetailPrice, @intGoodsId = GoodsId,
@intInputLineId = InputLineId
FROM CD.Parties WHERE Id = @OldPartyId
IF (@@rowcount <> 1 )
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Не найдена партия с идентификатором ' + cast(@OldPartyId as varchar(10)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@NewRetailPrice = @decOldPrice) 
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Новая цена равна старой цене!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @intT = DocTypeId, @datDocDate = DocDate FROM [CA].[Documents] WHERE Id = @DocId
IF (@intT Is Null)
BEGIN
	SELECT @intErrCode = 4, @strMsg = 'Не найден документ с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@intT <> 10)
BEGIN
	SELECT @intErrCode = 5, @strMsg = 'Неправильный тип документа с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @datSrcDocDate = DocDate FROM CD.Parties P INNER JOIN [CA].[Documents] D ON P.DocId = D.Id
WHERE P.Id = @OldPartyId

IF (@datDocDate < @datSrcDocDate )
BEGIN
	SELECT @intErrCode = 6, 
	@strMsg = 'Дата документа переоценки меньше даты создания переоцениваемой партии!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

-- проверка товародвижения по партии, которая переоценивается
SET @intT = -1 * @Qntty
EXEC @intRet = dbo.CheckPartyFlow @OldPartyId, @intT, @datDocDate, @intInputCount OUTPUT, @intOutputCount OUTPUT
IF @intRet <> 0 RETURN @intRet

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

IF (@NewBarCode Is Null) EXEC [dbo].[GetNextBarCode]	@NewBarCode OUTPUT
--получение значения идентификатора
EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intReturnLineId OUTPUT
IF @intRet <> 0 RETURN @intRet

BEGIN TRAN

--списание заданного количества из исходной партии
INSERT INTO [CA].[GoodsDocLines]
(Id, DocId, PartyId, [Qntty], [RetailSum], [MD],[MW])
VALUES(@intReturnLineId, @DocId, @OldPartyId, -1 * @Qntty, @decOldPrice * -1.0 * @Qntty, @MD, @MW)

SELECT @intErrCode = @@error, @intRowCount = @@rowcount
IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 7, 
	@strMsg = 'Запись по исходной партии в таблицу товародвижения не добавлена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intNewPartyId OUTPUT
IF @intRet <> 0 RETURN @intRet

--создание новой партии по новой цене
INSERT INTO CD.Parties 
(Id, [DocId], [GoodsId], [BarCode], [RetailPrice], InputLineId, Blocked, Note, [MD], [MW])
VALUES (@intNewPartyId, @DocId, @intGoodsId, @NewBarCode, @NewRetailPrice, @intInputLineId, 0, @Note, @MD, @MW)

SELECT @intErrCode = @@error, @intRowCount = @@rowcount
IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 8, 
	@strMsg = 'Новая партия не добавлена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--создание проводки по новой партии
INSERT INTO [CA].[GoodsDocLines]
(Id, DocId, PartyId, [Qntty], [RetailSum], ReturnLineId, [MD],[MW])
VALUES(@intNewPartyId, @DocId, @intNewPartyId, @Qntty, @NewRetailPrice * @Qntty, @intReturnLineId, @MD, @MW);

SELECT @intErrCode = @@error, @intRowCount = @@rowcount
IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 9, 
	@strMsg = 'Запись по новой партии в таблицу товародвижения не добавлена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

	SET NOCOUNT OFF;
--запись строки в таблицу списания/переоценки
INSERT INTO CD.RepriceWriteoffLines (Id, [DocId], [PartyId],
GoodsDocLineId, RepriceWriteoffReasonId, RepriceWriteoffReasonText, QualityLossMark,
[Note], [MD], [MW]) 
VALUES ( @intNewPartyId, @DocId, @intNewPartyId, @intNewPartyId, 
@RepriceWriteoffReasonId, @RepriceWriteoffReasonText, @QualityLossMark,
@Note, @MD, @MW);

SELECT @intErrCode = @@error, @intRowCount = @@rowcount

	SET NOCOUNT ON;

IF @intErrCode <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intErrCode
END
IF (@intRowCount <> 1)
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	SELECT @intErrCode = 10, 
	@strMsg = 'Запись в таблицу списания/переоценки не добавлена!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

COMMIT TRAN

SELECT Id, DocId, GoodsId, OldPartyId, OldPrice, OldBarCode, Qntty, NewPartyId, NewRetailPrice, NewBarCode, 
RepriceWriteoffReasonId, RepriceWriteoffReasonName, 
RepriceWriteoffReasonText, QualityLossMark,
Note, MD, MW
FROM dbo.vwRepriceLines WHERE Id = @intNewPartyId

RETURN 0
